/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CapaSeguridad;

import java.io.Serializable;
import java.util.Date;

/**
 * Clase usada para el manejo de errores
 * @author Wicho
 */
public class Error implements Serializable{//quitar el serializable si ya no se usan archivos
    
    private String _strDescripcion;//descripcion del error
    private CodigoErrorEnum _intCodigoError;//codigo del error, ya existe un listado de codigos que hay que
    //utilizar se llama CodigoErrorEnum, ahi poner todos los tipos de errores posibles.
    private java.lang.Exception _Exception;//la causa original del error, en la cual se puede encontrar informacion como donde ocurrio, archivo, linea, etc
    private java.util.Date _Hora;//para poder almacenar a que hora paso
    private String _strUsuario;//el usuario que estaba logueado cuando paso el error, para esto
    //las personas encargadas del logueo deben modificar el metodo obtenerUsuarioActual(); para que devuelva quien esta logueado
    private static java.io.File _fArchivo = new java.io.File("BitacoraErrores.GuateBay");//puesto que de momento no se tiene acceso a la bd, entonces se almacena la lista de errores en un archivo
    //cuando esto se modifique y se almacenen los errores en la bd,esta variable puede ser eliminada, solo indica en que archivo se guardan los errores
    private static java.util.LinkedList<Error> _lista = new java.util.LinkedList();//la lista de errores, al manejar la base de datos se leen aqui todos los errores
    //por el momento esta lista  es la que se guarda en el archivo ,y se lee de el.
    
    /**
     * Constructor por default privado que solo inicializa la hora y el usuario y los demas constructores lo llaman
     */
    private Error()
    {
        this._Hora = new java.util.Date();
        this._strUsuario = this.obtenerUsuarioActual();
    }
    
    /**
     * Constructor que recibe el origen del error como parametro y agrega valores default a los demas campos
     * como que el error fue desconocido, la descripcion del error es igual al mensaje de la excepcion
     * Ademas ejecuta el constructor privado por default para obtener la hora del error y el usuario que lo provoco
     * @param exception indica el origen del error,osea que excepcion lo desencadeno
     */
    public Error(java.lang.Exception exception)
    {
        this();
        this._Exception = exception;
        this._strDescripcion = exception.getMessage();
        this._intCodigoError = CodigoErrorEnum.ErrorDesconocido;
    }
    
    /**
     * Constructor que recibe el origen del error como parametro y una descripcion del error
     * asi como un valor default para el codigo error, indicando que es un error desconodido
     * Ademas ejecuta el constructor privado por default para obtener la hora del error y el usuario que lo provoco
     * @param exception indica el origen del error,osea que excepcion lo desencadeno
     * @param descripcion la descripcion del error
     */
    public Error(java.lang.Exception exception,String descripcion)
    {
        this(exception);
        this._strDescripcion = descripcion;
    }
    
    /**
     * Constructor que recibe el origen del error como parametro , una descripcion del error
     * y el codigo del mismo, el tipo esta definido en el listado CodigoErrorEnum
     * Ademas ejecuta el constructor privado por default para obtener la hora del error y el usuario que lo provoco
     * @param exception indica el origen del error,osea que excepcion lo desencadeno
     * @param descripcion la descripcion del error
     * @param codigo el codigo del error
     */
    public Error(java.lang.Exception exception,String descripcion,CodigoErrorEnum codigo)
    {
        this(exception,descripcion);
        this._intCodigoError = codigo;
    }
    
    /**
     * Constructor que  recibe una excepcion especifica del proyecto como parametro, en esta se asume que ya se
     * tienen los datos como descripcion y codigo por lo cual no se pasa como parametro.
     * Ademas ejecuta el constructor privado por default para obtener la hora del error y el usuario que lo provoco
     * @param exception 
     */
    public Error(GuateBayException exception)
    {
        this();
        this._Exception = exception;
        this._strDescripcion = exception.getStrDescripcion();
        this._intCodigoError = exception.getIntCodigoError();
    }
    
    /**
     * 
     * Metodo que inserta el error para guardar una bitacora de errores ocurridos en el sistema
     * Los encargados de la capa de acceso a datos deben modificarlo para ingresar el error a una tabla de la db
     * de momento esta escribiendo en archivos, cuando se modifique quitar la llamada a registrarError() y
     * colocar el codigo de insercion a la base de datos
     */
    public void insertarError()
    {
        registrarError();//este codigo quitarlo al momento de realizar la insercion.
    }
    
    /**
     * Metido utilizado para guardar la listsa de errores en un archivo, solo es usado temporalmente
     * mientras se modifica insertarError() para guardar los errores en la bd
     */
    private void registrarError()
    {
        java.io.FileOutputStream fileOut;
        java.io.ObjectOutputStream objetOut;
        
        try
        {
            _lista.add(this);
            if(!_fArchivo.exists())
                _fArchivo.createNewFile();
            
                fileOut = new java.io.FileOutputStream(_fArchivo);
                objetOut = new java.io.ObjectOutputStream(fileOut);
                objetOut.writeObject(_lista);
                objetOut.close();
                fileOut.close();
            
        }
        catch(java.io.IOException exception)
        {
            System.out.println("error en el error :"+this._strDescripcion);
        }
    }
    
    
    /**
     * Metodo publico que devuelve un listado con todos los errores registrados.
     * De momento lee la lista entera del archivo donde se almacenaron con el metodo de insertar() 
     * pero debe ser modificado para hacer la lectura de la bd quitando la llamada a obtenerTodosLosErroresDeArchivo() y sustituir el codigo de lectura de la bd
     * @return la lista de todos los errores
     */
    public static java.util.LinkedList<Error> obtenerTodosLosErrores()
    {
        _lista=obtenerTodosLosErroresDeArchivo();
        
        return _lista;
    }
    
    /**
     * Similar al metodo que escribe en el archivo,este lee del archivo y debe ser eliminado o simplemente no usarlo
     * @return la lista de errores en el archivo
     */
    private static java.util.LinkedList<Error> obtenerTodosLosErroresDeArchivo()
    {
        java.util.LinkedList<Error> lstErrores= new java.util.LinkedList();
        Error errorLeido;
        java.io.FileInputStream entrada ; //objTemporal, reconoce el nombre del Objeto de la Memoria. 
        java.io.ObjectInputStream objEntrada =null;
        Object auxiliarLectura;
        
        try
        {
            if(!_fArchivo.exists())
                return lstErrores;
            
            entrada = new java.io.FileInputStream( _fArchivo );
            
            if(entrada.available() != 0)
                objEntrada  = new java.io.ObjectInputStream( entrada );
            
            if(objEntrada != null)
            {
                auxiliarLectura = objEntrada.readObject();
                
                if(auxiliarLectura != null && auxiliarLectura instanceof java.util.List)
                {
                    _lista = (java.util.LinkedList<Error>) auxiliarLectura;
                    lstErrores = _lista;
                }
            }
                
            
        }
        catch(Exception err)
        {
            System.out.println("Error al leer los rrores "+err.getMessage());
        }
        
        return lstErrores;
    }
    
    
    
    /**
     * Obtiene un error en especifico de la listsa segun su posicion
     * O null en caso de que la lista este vacia o se quiera una posicion que no existe
     * @param posicion el numero de elemento deseado
     * @return el error en la posicion del parametro o null
     */
    public static Error obtenerErrorEnPosicion(int posicion)
    {
        if(_lista != null && _lista.size()>posicion)
            return _lista.get(posicion);
        
        return null;
    }
    /**
     * Este metodo lo que hace es obtener el usuario actualmente logueado al sistema
     * debe de ser modificado para que quienes manejan el logueo encuentren una forma de obtener el usuario actualmente logueado
     * @return el usuario logueado actualmente al sistema
     */
    private String obtenerUsuarioActual()
    {
        String strUsuario = "Obtener usuario logueado";
        
        return strUsuario;
    }

    /**
     * getter
     * @return 
     */
    public Exception getException() {
        return _Exception;
    }

    /**
     * getter
     * @return 
     */
    public Date getHora() {
        return _Hora;
    }

    /**
     * getter
     * @return 
     */
    public CodigoErrorEnum getIntCodigoError() {
        return _intCodigoError;
    }

    /**
     * getter
     * @return 
     */
    public String getStrDescripcion() {
        return _strDescripcion;
    }

    /**
     * getter
     * @return 
     */
    public String getStrUsuario() {
        return _strUsuario;
    }
    
    
}
